#define xuser mixc::powerful_cat
#include"lang/cxx/insert.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/counter.hpp"
#include"utils/static_length_of.hpp"

// 两种分配方案
#define xuse_temp_allocator 0

xinit(xuser::the_main){
    using namespace xuser;

#if xuse_temp_allocator
    // temp_allocator 是个分配的内存是临时内存，出了作用域就释放了，c08 指向的内容将无效
    temp_allocator memory;
    auto alloc      = memory.item_as<char>();
#else
    // 注意：
    // 每次返回的地址是一样的，所以是新值覆盖旧值的逻辑
    // 这种方式使用有一些限制，但性能好一些
    char buf[128];
    auto alloc = [&](uxx length) -> char * { // 需要指定缓冲区类型
        if (length > static_length_of(buf)){ // 检查缓冲区大小是一个好习惯
            // 返回 null 并不会导致异常，只是会终止分配后续的操作，如果没有特殊要求，则会生成空串
            return nullptr;
        }
        return buf;
    };
#endif

    // 演示：在字符串中插入其他的字符串
    {
        //         012345
        c08 str = "meme-@miao.email.com";
        //              ^ 在 index=5 @ 前插入

        // meme-powerful_cat@miao.email.com
        xhint(str.insert(5, "powerful_cat", alloc));

        str = "meme-powerful_cat@miao.email.";
        //                                  ^ 在 index=-1 字符串末尾插入

        // meme-powerful_cat@miao.email.cn
        xhint(str.insert(-1, "cn", alloc));

        // 
        // meme-powerful_cat@miao.emailxxx.
        //                             ^^^
        xhint(str.insert(-2, "xxx", alloc));
    }
};
